信息收集— 僵尸扫描

0x00. 信息收集简介

  渗透测试中,信息收集是最重要的阶段,占据整个渗透测试的60%左右,根据收集到的信息可以有效提高我们渗透测试的成功率,可见高效的信息收集对我们是多么重要。僵尸扫描正是信息收集环节的端口扫描阶段,但是常见的端口扫描过程往往会在网络层被发现痕迹,导致没有达到预期的隐藏目的,僵尸扫描却能有效的隐藏自己的踪迹。


0x01. 僵尸扫描介绍

  往往鱼与熊掌不可得兼,僵尸扫描在隐藏踪迹的同时也有着其极其苛刻的使用条件。想要实施僵尸扫描必须具备下列两个必要条件

  其一:有一台合格的僵尸机,所谓的僵尸机就是足够空闲,并且不和除了我们之外的任何其他机器进行网络通信的主机,这个主要取决于他的IPID的连续性(往往主流的操作系统的IPID都是随机产生的或全为0),后面会讲到。

  其二:可伪造源IP地址,在某些网络设备中防火墙会限制伪造的源地址,导致扫描失败。


0x02. 僵尸扫描过程

image

如上图所示,该图清晰的像我们展示了僵尸扫描的全过程

  一.首先由本地主机(scanner)向僵尸机(zombie)发送一个SYN/ACK包,因为发送的数据包不是SYN包,所以zombie会觉得莫名奇妙居然会有人向我发送SYN/ACK包,于是zombie会原路返回一个RST包来中断连接,此时在RST包中便会带有zombie的IPID,假设此时的IPID=x。详细的tcp/ip通信过程点击这里

  二.紧接着又由本地主机(scanner)伪造源IP.SRC地址为zombie的IP,指定一个端口号并向目标主机(target)发送一个SYN包。收到SYN包后如果target端口开放,便会给源IP.SRC返回一个SYN/ACK包,此时由zombie收到该SYN/ACK包,此时便会同第一步一样,给target返回一个RST包,此时的IPID=x+1。如果端口未开放,target会直接给zombie返回一个RST包,zombie不做任何回应,IPID=x。

  三. 最后再由本地主机(scanner)给zombie发送一个SYN/ACK包,步骤和第一步一样,zombie返回一个RST包,但是此时的IPID和第一步有差别,我们便通过IPID所差的值判断target端口是否开放。如果此时的IPID=x+1则第二步时zombie没有发送任何数据包,于是可知target端口关闭;如果IPID=x+2则第二步时zombie发送了一个RST包,于是可知target端口开放。


0x03. 僵尸扫描实战篇

  看我写了这么多相信很多人都已经蒙圈了吧,理论有时后确实不容易理解,但是一旦理解了便会觉得just soso!下面我直接给大家实战演习,看完实战篇再来看理论相信大家会获益匪浅!

一:环境准备

  扫描主机 Mac: { ip:192.168.0.103 }

  僵尸主机 xp: { ip:192.168.0.107 }

  目标主机 metasploitable2: { ip:192.168.0.105 }

二: python2.7脚本

  其实nmap自带有僵尸扫描模块,但是我这里需要抓包给大家分析,所以自己写了个简单的python脚本(完整的脚本我放在云盘上),用来发现僵尸机(zombie)和抓包分析,后面会直接演示如何用nmap进行僵尸机发现和利用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def zombies_scan(zombie_ip):
rep1 = sr1(IP(dst=zombie_ip)/TCP(flags='SA'),timeout=2)
send(IP(dst=zombie_ip)/TCP(flags='SA'))
rep2 = sr1(IP(dst=zombie_ip)/TCP(flags='SA'),timeout=2)
if rep2[IP].id == (rep1[IP].id+2):
print "[*]" + zombie_ip + " is Incremental!"
target_ip = raw_input("input the target_ip :")
port_scan(target_ip, zombie_ip)
else:
print "[*]" + zombie_ip + "is not Incremental!\n"
def port_scan(target_ip,zombie_ip):
print "------begin to scan target_ip!-------"
for port in range(1,100):
try:
start = sr1(IP(dst=zombie_ip)/TCP(flags='SA',dport=port),timeout=2)
send(IP(src=zombie_ip,dst=target_ip)/TCP(flags='S',dport=port))
end = sr1(IP(dst=zombie_ip)/TCP(flags='SA'),timeout=2)
if end[IP].id == (start[IP].id + 2):
print "[*]" + target_ip + ':' + port + "is open"
except:
pass

第一个函数用来发现僵尸机,利用了Scapy库构造数据包,原理就是上面所讲的向要探测的僵尸主机连续发送三个SYN/ACK包,通过判断IPID的值来确定是否是个好僵尸。

第二个函数和第一个函数差不多,同样是利用Scapy库构造数据包,原理上面第二步有,就不再啰嗦了。下面我来演示一下操作。

三: 操作步骤

  1.首先调用第一个函数判断xp是否是僵尸机

  image

  2. 抓包看看第一个函数是不是像我们预想中的那样发包的

image

可以看到发送的数据包正像我们预期中的一样,先发一个SYN/ACK,再收到一个RST,重复三次,判断IPID,这时再来看看IPID如何呢!

image


image


image


  3. 已经可以确定xp就是一个好僵尸了,那么接下来便是利用第二个函数对它来进行端口扫描。因为利用zombie时中途会伪装IP,所以我在Wireshark中没有发现连续的包,所以这里就不截数据包的图了。第二个函数的思路很清晰,希望懂python的朋友好好看看。


0x04. nmap中的僵尸扫描

  在介绍nmap之前笔者有一个问题想要探讨一下,就是既然有了nmap这个无敌强大的扫描工具的存在,那么为什么我们还要自己写脚本呢?这里仅仅是我个人的理解,不喜勿喷,笔者认为其实工具仅仅是为了让我们更方便的做一些想做的事情,或许直接调用一个工具再添加一两个参数选项就能超越我们几十上百行脚本,也更能出色的完成任务,但是理解工具工作的原理是否更重要呢!一味的使用别人的工具而不去发现工具工作的原理最后是否只是个工具小子,笔者不屑!

  一:nmap发现僵尸机

   image

  二:nmap利用僵尸机进行端口扫描

   image


0x05. 总结

  虽然僵尸扫描的条件如此苛刻,但是原理just soso!在某些情况下说不定它还能派上大的用场,免去很多不必要的麻烦,所谓技不压身,多学点知识技能对自己还是很有好处的(o^^o)


文章目录
  1. 1. 0x00. 信息收集简介
    1. 1.0.1.   渗透测试中,信息收集是最重要的阶段,占据整个渗透测试的60%左右,根据收集到的信息可以有效提高我们渗透测试的成功率,可见高效的信息收集对我们是多么重要。僵尸扫描正是信息收集环节的端口扫描阶段,但是常见的端口扫描过程往往会在网络层被发现痕迹,导致没有达到预期的隐藏目的,僵尸扫描却能有效的隐藏自己的踪迹。
  • 2. 0x01. 僵尸扫描介绍
    1. 2.1.   往往鱼与熊掌不可得兼,僵尸扫描在隐藏踪迹的同时也有着其极其苛刻的使用条件。想要实施僵尸扫描必须具备下列两个必要条件
      1. 2.1.1.   其一:有一台合格的僵尸机,所谓的僵尸机就是足够空闲,并且不和除了我们之外的任何其他机器进行网络通信的主机,这个主要取决于他的IPID的连续性(往往主流的操作系统的IPID都是随机产生的或全为0),后面会讲到。
      2. 2.1.2.   其二:可伪造源IP地址,在某些网络设备中防火墙会限制伪造的源地址,导致扫描失败。
  • 3. 0x02. 僵尸扫描过程
    1. 3.1. 如上图所示,该图清晰的像我们展示了僵尸扫描的全过程
      1. 3.1.1.   一.首先由本地主机(scanner)向僵尸机(zombie)发送一个SYN/ACK包,因为发送的数据包不是SYN包,所以zombie会觉得莫名奇妙居然会有人向我发送SYN/ACK包,于是zombie会原路返回一个RST包来中断连接,此时在RST包中便会带有zombie的IPID,假设此时的IPID=x。详细的tcp/ip通信过程点击这里
      2. 3.1.2.   二.紧接着又由本地主机(scanner)伪造源IP.SRC地址为zombie的IP,指定一个端口号并向目标主机(target)发送一个SYN包。收到SYN包后如果target端口开放,便会给源IP.SRC返回一个SYN/ACK包,此时由zombie收到该SYN/ACK包,此时便会同第一步一样,给target返回一个RST包,此时的IPID=x+1。如果端口未开放,target会直接给zombie返回一个RST包,zombie不做任何回应,IPID=x。
      3. 3.1.3.   三. 最后再由本地主机(scanner)给zombie发送一个SYN/ACK包,步骤和第一步一样,zombie返回一个RST包,但是此时的IPID和第一步有差别,我们便通过IPID所差的值判断target端口是否开放。如果此时的IPID=x+1则第二步时zombie没有发送任何数据包,于是可知target端口关闭;如果IPID=x+2则第二步时zombie发送了一个RST包,于是可知target端口开放。
  • 4. 0x03. 僵尸扫描实战篇
    1. 4.0.1.   看我写了这么多相信很多人都已经蒙圈了吧,理论有时后确实不容易理解,但是一旦理解了便会觉得just soso!下面我直接给大家实战演习,看完实战篇再来看理论相信大家会获益匪浅!
  • 4.1. 一:环境准备
    1. 4.1.1.   扫描主机 Mac: { ip:192.168.0.103 }
    2. 4.1.2.   僵尸主机 xp: { ip:192.168.0.107 }
    3. 4.1.3.   目标主机 metasploitable2: { ip:192.168.0.105 }
  • 4.2. 二: python2.7脚本
    1. 4.2.1.   其实nmap自带有僵尸扫描模块,但是我这里需要抓包给大家分析,所以自己写了个简单的python脚本(完整的脚本我放在云盘上),用来发现僵尸机(zombie)和抓包分析,后面会直接演示如何用nmap进行僵尸机发现和利用。
    2. 4.2.2. 第一个函数用来发现僵尸机,利用了Scapy库构造数据包,原理就是上面所讲的向要探测的僵尸主机连续发送三个SYN/ACK包,通过判断IPID的值来确定是否是个好僵尸。
    3. 4.2.3. 第二个函数和第一个函数差不多,同样是利用Scapy库构造数据包,原理上面第二步有,就不再啰嗦了。下面我来演示一下操作。
  • 4.3. 三: 操作步骤
    1. 4.3.1.   1.首先调用第一个函数判断xp是否是僵尸机
    2. 4.3.2.   2. 抓包看看第一个函数是不是像我们预想中的那样发包的
    3. 4.3.3. 可以看到发送的数据包正像我们预期中的一样,先发一个SYN/ACK,再收到一个RST,重复三次,判断IPID,这时再来看看IPID如何呢!
    4. 4.3.4.   3. 已经可以确定xp就是一个好僵尸了,那么接下来便是利用第二个函数对它来进行端口扫描。因为利用zombie时中途会伪装IP,所以我在Wireshark中没有发现连续的包,所以这里就不截数据包的图了。第二个函数的思路很清晰,希望懂python的朋友好好看看。
  • 5. 0x04. nmap中的僵尸扫描
    1. 5.0.1.   在介绍nmap之前笔者有一个问题想要探讨一下,就是既然有了nmap这个无敌强大的扫描工具的存在,那么为什么我们还要自己写脚本呢?这里仅仅是我个人的理解,不喜勿喷,笔者认为其实工具仅仅是为了让我们更方便的做一些想做的事情,或许直接调用一个工具再添加一两个参数选项就能超越我们几十上百行脚本,也更能出色的完成任务,但是理解工具工作的原理是否更重要呢!一味的使用别人的工具而不去发现工具工作的原理最后是否只是个工具小子,笔者不屑!
  • 5.1.   一:nmap发现僵尸机
  • 5.2.   二:nmap利用僵尸机进行端口扫描
  • 6. 0x05. 总结
    1. 6.0.1.   虽然僵尸扫描的条件如此苛刻,但是原理just soso!在某些情况下说不定它还能派上大的用场,免去很多不必要的麻烦,所谓技不压身,多学点知识技能对自己还是很有好处的(o^^o)
  • |